﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Cesave.Domain.PermisosModule.Entities;
using System.ComponentModel;
using Cesave.Domain.PermisosModule.Contracts.CultivosEstaciones;
using Cesave.Infrastructure.CrossCutting.IoC;
using System.Windows.Forms;
using Cesave.Domain.Core.Entities;

namespace Cesave.DistributedServices.PermisosModule.WindowsHost.ViewModels.Catalogs.Cultivos
{
	/// <summary>
	/// 
	/// </summary>
	public partial class CultivosViewModel
	{
		#region Private properties

		/// <summary>
		/// Estaciones de siembra.
		/// </summary>
		private List<CultivosEstacion> _estaciones;

		/// <summary>
		/// Estación de siembra seleccionada en la vista.
		/// </summary>
		private CultivosEstacion _estacion;

		#endregion

		#region Public properties

		/// <summary>
		/// Estaciones de siembra.
		/// </summary>
		public List<CultivosEstacion> Estaciones
		{
			get
			{
				return _estaciones;
			}
			private set
			{
				_estaciones = value;
				if (_estaciones != null)
					RaisePropertyChanged("Estaciones");
			}
		}

		/// <summary>
		/// Estación de siembra.
		/// </summary>
		public CultivosEstacion Estacion
		{
			get
			{
				return _estacion;
			}
			private set
			{
				_estacion = value;
				if (_estacion != null)
					RaisePropertyChanged("Estacion");
			}
		}

		#endregion

		#region Private methods

		/// <summary>
		/// Carga las estaciones de siembra.
		/// </summary>
		private void LoadEstaciones()
		{
			StartWaiting();
			using (BackgroundWorker worker = new BackgroundWorker())
			{
				worker.DoWork += (sender, e) =>
				{
					ICultivosEstacionService service = IoCFactory.Resolve<ICultivosEstacionService>();
					e.Result = service.FindAllCultivosEstaciones();
				};
				worker.RunWorkerCompleted += (sender, e) =>
				{
					EndWaiting();
					if (!e.Cancelled && e.Error == null)
						Estaciones = e.Result as List<CultivosEstacion>;
					else if (e.Error != null)
						ShowMessage(e.Error.Message);
				};
				worker.WorkerSupportsCancellation = true;
				worker.RunWorkerAsync();
			}
		}

		#endregion

		#region Event methods

		/// <summary>
		/// Identifica la estación de siembra actualmente seleccionada en la vista.
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void SetCurrentEstacion(object sender, EventArgs e)
		{
			BindingSource bindingSource = sender as BindingSource;
			if (bindingSource != null && bindingSource.Current != null)
				Estacion = bindingSource.Current as CultivosEstacion;
		}

		/// <summary>
		/// Se ejecuta al asignarle algún valor a la propiedad Estaciones
		/// del modelo de la vista.
		/// </summary>
		private void OnEstacionesPropertyChanged()
		{
			_view.cultivosEstacionesBindingSource.DataSource = Estaciones;
			_view.cultivosEstacionesBindingSource.CurrentChanged += SetCurrentEstacion;
			SetCurrentEstacion(_view.cultivosEstacionesBindingSource, new EventArgs());
		}

		/// <summary>
		/// Se ejecuta al asignarle algún valor a la propiedad Estacion
		/// del modelo de la vista.
		/// </summary>
		private void OnEstacionPropertyChanged()
		{
			if (IsCultivoReady)
			{
				Cultivo.EstacionId = Estacion.EstacionId;
				Cultivo.MarkAsModified();
			}
		}

		#endregion

	}
}
